﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using publico;
using negocios;
using objetos;
using nfe;
using System.Text;
using System.Data;
using System.IO;
using System.Transactions;

namespace softsales.pagina.nf_gerenciar
{
    public partial class nf_gerenciar_listar : System.Web.UI.Page
    {
        OBJ_TB_NF o_tb_nf = new OBJ_TB_NF();
        BLL_TB_NF b_tb_nf = new BLL_TB_NF();

        // parametro
        BLL_TB_NF_PARAMETRO b_tb_nf_parametro = new BLL_TB_NF_PARAMETRO();
        OBJ_TB_NF_PARAMETRO o_tb_nf_parametro = new OBJ_TB_NF_PARAMETRO();

        BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();
        BLL_TB_NF_TIPO_EMISSAO b_tb_nf_tipo_emissao = new BLL_TB_NF_TIPO_EMISSAO();
        BLL_TB_NF_HISTORICO b_tb_nf_historico = new BLL_TB_NF_HISTORICO();
        BLL_TB_NF_XML_VENDA b_tb_nf_xml_venda = new BLL_TB_NF_XML_VENDA();
        OBJ_TB_NF_XML_VENDA o_tb_nf_xml_venda = new OBJ_TB_NF_XML_VENDA();

        BLL_TB_LOG_ERRO b_tb_log_erro = new BLL_TB_LOG_ERRO();

        protected void Page_Load(object sender, EventArgs e)
        {
            if (PUB_SESSAO.Logado())
            {
                if (!IsPostBack)
                {

                    b_tb_empresa.PreencheControleWeb(DDL_ID_EMPRESA, true);
                    b_tb_nf_tipo_emissao.PreencheControleWeb(DDL_ID_TIPO_EMISSAO, true);
                    CarregaGrid();
                }

            }

        }
        
        
        protected void IMG_BTN_VALIDAR_Click(object sender, ImageClickEventArgs e)
        {
            try
            {


                List<string> lista_nf = new List<string>();
                Dictionary<string, string> lista_resultado = new Dictionary<string, string>();
                lista_nf = PUB_FUNCOES.RetornaListaDeValoresDataKeyGridView(GRV_TB_NF, "id");
                NFE nf = new NFE();
                
                string nfe_XML = string.Empty;
                int tipoXML = 2 ;
                string msgResultado = string.Empty;
                int qtdeErros;
                string erroXML = string.Empty;
                int Resultado ;                
                    

                foreach (String id in lista_nf)
                {

                    o_tb_nf = b_tb_nf.SelecionarObjetoPorId(Convert.ToInt32(id));

                    switch(o_tb_nf.id_status)
                    {
                        case (int)PUB_ENUM.NF_STATUS.CANCELADA:
                            msgResultado = "Não é possível validar o Xml porque a nota fiscal está cancelada.";                            
                            break;
                        case (int)PUB_ENUM.NF_STATUS.ASSINADA:
                            
                            nfe_XML = nf.CarregarXML(o_tb_nf, (int)PUB_ENUM.NF_STATUS.ASSINADA);

                            if (nfe_XML != string.Empty)
                            {
                                Resultado = nf.ValidarXML(nfe_XML, tipoXML, out msgResultado, out qtdeErros, out erroXML);
                            }
                            else
                            {
                                msgResultado = "O arquivo Xml não foi encontrado verifique o caminho do XML.";
                            }
                            break;

                        case (int)PUB_ENUM.NF_STATUS.AUTORIZADA:
                            msgResultado = "Não é possível validar o Xml porque a nota fiscal está autorizada.";
                            break;

                        case (int)PUB_ENUM.NF_STATUS.EMDIGITACAO:
                            msgResultado = "É necessário assinar a nota fiscal para validar o XML.";
                            break;

                        case (int)PUB_ENUM.NF_STATUS.DENEGADA:

                            msgResultado = "Não é possível validar o Xml porque a nota fiscal está denegada.";
                            break;

                        case (int)PUB_ENUM.NF_STATUS.PROBLEMA_TRANSMISSAO:

                            msgResultado = "Não é possível validar o Xml porque a nota fiscal está em transmissão com a Sefaz.";
                            break;

                        case (int)PUB_ENUM.NF_STATUS.PROCESSAMENTO_NA_SEFAZ:

                            msgResultado = "Não é possível validar o Xml porque a nota fiscal está em transmissão com a Sefaz.";
                            break;

                    }

                    Master.MSG_ALERTA(msgResultado);

                }                                 

            }
            catch (Exception)
            {
                
                throw;
            }

          

        }


        public void CarregaGrid()
        {

            try
            {
                StringBuilder sb = new StringBuilder();
                DataSet ds = new DataSet();

                List<string> lista = new List<string>();

                if (DDL_ID_EMPRESA.SelectedValue != string.Empty)
                {
                    lista.Add(string.Format(" tb_nf.id_empresa = '{0}'", DDL_ID_EMPRESA.SelectedValue));
                }           

                if (DDL_ID_TIPO_EMISSAO.SelectedValue != string.Empty)
                {
                    lista.Add(string.Format(" tb_nf.id_tipo_emissao = '{0}'", DDL_ID_TIPO_EMISSAO.SelectedValue));
                }

                if (TXT_CHAVE.Text != string.Empty)
                {
                    lista.Add(string.Format(" tb_nf.chave = '{0}'", TXT_CHAVE.Text));
                }

                if (TXT_CNPJ_CPF.Text != string.Empty)
                {
                    lista.Add(string.Format(" tb_cadastro.cnpj_cpf = '{0}'", TXT_CNPJ_CPF.Text));
                }

                if (TXT_SERIE.Text != string.Empty)
                {
                    lista.Add(string.Format(" tb_nf.serie = '{0}'", TXT_SERIE.Text));
                }

                if (TXT_NUM_NF_INICIAL.Text != string.Empty && TXT_NUM_NF_FINAL.Text != string.Empty)
                {
                    lista.Add(string.Format(" tb_nf.num_nota_fiscal between  {0} and {1}", TXT_NUM_NF_INICIAL.Text, TXT_NUM_NF_FINAL.Text));
                }

                if (TXT_DT_EMISSAO_INICIAL.Text != string.Empty && TXT_DT_EMISSAO_FINAL.Text != string.Empty)
                {
                    lista.Add(string.Format(" tb_nf.dt_emissao between  {0} and {1}", TXT_DT_EMISSAO_INICIAL.Text, TXT_DT_EMISSAO_FINAL.Text));
                }

                lista.Add(string.Format(" tb_nf.id_operacao = '{0}'", (int)PUB_ENUM.NF_OPERACAO.SAIDA));
  
                sb.Append(string.Join(" and ", lista.ToArray()));
 
                ds = b_tb_nf.Selecionar(sb.ToString(), PUB_PAGINACAO.Sort, PUB_PAGINACAO.PageIndex, PUB_PAGINACAO.PageSize);

                if (ds.Tables[0].Rows.Count > 0)
                {
                    GRV_TB_NF.DataSource = ds;
                    GRV_TB_NF.DataBind();
                    PUB_PAGINACAO.Paginacao(true);
                }
                else
                {
                    GRV_TB_NF.EmptyDataText = "Nenhum registro foi encontrado";
                    GRV_TB_NF.DataBind();
                }
            }
            catch (Exception)
            {

                Master.MSG_ALERTA("Erro ao tentar listar a tabela.");
            }


        }


        protected void IMG_BTN_ASSINAR_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                List<string> lista_nf = new List<string>();
                Dictionary<string, string> lista_resultado = new Dictionary<string, string>();
                lista_nf = PUB_FUNCOES.RetornaListaDeValoresDataKeyGridView(GRV_TB_NF, "id");
                NFE nf = new NFE();

                string path_absoluto = string.Empty;
                string path_relativo = string.Empty;
                string arquivo = string.Empty;
                string tipo = string.Empty;
                string tamanho = string.Empty;
                string full_name = string.Empty;
                string nfe_XML = string.Empty;
                string nfe_Assinada = string.Empty;
                string msgResultadoChave = string.Empty;
                string msgResultadoAssinar = string.Empty;
                string chaveNFe = string.Empty;
                string cNF = string.Empty;
                string cDV = string.Empty;
                int status ;
                int cStat = 0;


                if (lista_nf.Count > 0)
                {
                    foreach (String id in lista_nf)
                    {

                        o_tb_nf = b_tb_nf.SelecionarObjetoPorId(Convert.ToInt32(id));
                        
                        // carrega o xml com status em digitacao
                        nfe_XML = nf.CarregarXML(o_tb_nf,(int)PUB_ENUM.NF_STATUS.EMDIGITACAO);

                        // verifica se o arquivo foi carregado
                        if (nfe_XML != string.Empty)
                        {
                            nfe_Assinada = nf.Assinar(o_tb_nf, nfe_XML, "infNFe", out cStat, out msgResultadoAssinar);

                            if (Equals(cStat, 5300))
                            {

                                b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultadoAssinar, DateTime.Now);

                                if (Equals(nf.CriarChave(o_tb_nf, out msgResultadoChave, out cNF, out cDV, out chaveNFe), 5601))
                                {

                                    // path da nota fiscal assinada

                                    path_absoluto = nf.PathAbsoluto(o_tb_nf, PUB_ENUM.NF_STATUS.ASSINADA);
                                    path_relativo = nf.PathRelativo(o_tb_nf, PUB_ENUM.NF_STATUS.ASSINADA);
                                    arquivo = string.Format("{0}.xml", chaveNFe);
                                    full_name = string.Format("{0}\\{1}", path_absoluto, arquivo);

                                    // se o diretorio não existir cria um novo diretorio
                                    if (!PUB_FUNCOES.ExisteDiretorio(path_absoluto))
                                    {
                                        PUB_FUNCOES.CriarDiretorio(path_absoluto);
                                    }         
                                    // verifica se existe o arquivo se existir exclui 
                                    if (PUB_FUNCOES.ExisteArquivo(full_name))
                                    {
                                        PUB_FUNCOES.ExcluirArquivo(full_name);
                                    }

                                    // salva o arquivo na pasta nfe assinada
                                    if (PUB_FUNCOES.SalvarXml(full_name, nfe_Assinada))
                                    {
                                        // verifica se existe o arquivo
                                        if (PUB_FUNCOES.ExisteArquivo(full_name))
                                        {
                                            FileInfo fi = PUB_FUNCOES.InfoArquivo(full_name);

                                            tipo = fi.Extension.ToString();
                                            tamanho = fi.Length.ToString();
                                            status = (int)PUB_ENUM.NF_STATUS.ASSINADA;
                                            b_tb_nf.AlterarStatus(o_tb_nf.id, status);
                                            b_tb_nf_xml_venda.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, path_absoluto,path_relativo, arquivo, tamanho, tipo, PUB_SESSAO.Id, status, DateTime.Now);
                                            b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, string.Format("O arquivo {0}{1} foi salvo com sucesso", path_absoluto, arquivo), DateTime.Now);

                                            CarregaGrid();
                                            Master.MSG_ALERTA(msgResultadoAssinar);

                                        }
                                        else
                                        {
                                            Master.MSG_ALERTA(string.Format("Arquivo {0} não foi encontrado.", full_name));

                                        }



                                    }
                                    else
                                    {
                                        Master.MSG_ALERTA("Arquivo XML não foi encontrado.");
                                    }


                                }



                            }
                            else
                            {
                                b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultadoAssinar, DateTime.Now);
                                Master.MSG_ALERTA(msgResultadoAssinar);
                            }
                        }
                        else
                        {
                            Master.MSG_ALERTA("Não foi possível carregar o arquivo xml, contate o administrador do sistema.");
                        }


                        break;
                    }
                }
                else
                {
                    Master.MSG_ALERTA("É necessário selecionar uma nota para assinar");
                }

          
            }
            catch (Exception ex)
            {

                b_tb_log_erro.IncluirLogErro(ex);
            }
        }

        protected void IMG_BTN_TRANSMITIR_Click(object sender, ImageClickEventArgs e)
        {
            int id_nf;
            string nfe_XML = string.Empty;
            string nfe_Assinada = string.Empty;
            string nfe_Autorizada = string.Empty;
            string msgResultado = string.Empty;
            string msgDados = string.Empty;
            string nroRecibo = string.Empty;
            string dhRecbto = string.Empty;
            string chaveNFe = string.Empty;
            string tipo = string.Empty;
            string tamanho = string.Empty;
            int status;
            string erroXML = string.Empty;
            string msgRetWS = string.Empty;
            string arquivo = string.Empty;
            string full_name = string.Empty;
            string tMed = string.Empty;
            string cNF = string.Empty;
            string cDV = string.Empty;
            string nroProtocolo = string.Empty;
            string dhProtocolo = string.Empty;
            string cMsg = string.Empty;
            string xMsg = string.Empty;
            string path_absoluto = string.Empty;
            string path_relativo = string.Empty;
            int cResultado;
            int cStat = 0;

            List<string> lista_nf = new List<string>();
            Dictionary<string, string> lista_resultado = new Dictionary<string, string>();
            lista_nf = PUB_FUNCOES.RetornaListaDeValoresDataKeyGridView(GRV_TB_NF, "id");
            NFE nf = new NFE();
     
            try
            {

                using (TransactionScope scope = new TransactionScope())
                {


                    if (lista_nf.Count > 0)
                    {
                        foreach (String id in lista_nf)
                        {
                            id_nf = Convert.ToInt32(id);

                            o_tb_nf = b_tb_nf.SelecionarObjetoPorId(id_nf);

                            // Cria a Chave de Acesso
                            cResultado = nf.CriarChave(o_tb_nf, out msgResultado, out cNF, out cDV, out chaveNFe);
 
                            if (o_tb_nf.id_status == (int)PUB_ENUM.NF_STATUS.EMDIGITACAO)
                            {

                                // gero o arquivo xml
                                if (chaveNFe != string.Empty)
                                {
                                    nfe_XML = nf.GerarXML(o_tb_nf, chaveNFe);
                                }

                                // Envia e Assina a nota fiscal
                                nfe_Assinada = nf.EnviaNFe2G(o_tb_nf, nfe_XML, out msgDados, out msgRetWS, out cStat, out msgResultado, out nroRecibo, out dhRecbto, out tMed);

                                // Grava Histórico nota fiscal assinada
                                b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultado, DateTime.Now);


                                // Grava a nota fiscal na pasta de nota fiscal assinada
                                if (nfe_Assinada != string.Empty)
                                {
                                    // path da nota fiscal assinada
                                    path_absoluto = nf.PathAbsoluto(o_tb_nf, PUB_ENUM.NF_STATUS.ASSINADA);
                                    path_relativo = nf.PathRelativo(o_tb_nf, PUB_ENUM.NF_STATUS.ASSINADA);
                                    arquivo = string.Format("{0}.xml", chaveNFe);
                                    full_name = string.Format("{0}\\{1}", path_absoluto, arquivo);

                                    ExisteArquivo(full_name, path_absoluto);

                                    // Salva o arquivo na pasta autorizada
                                    if (PUB_FUNCOES.SalvarXml(full_name, nfe_Assinada))
                                    {
                                        // verifica se existe o arquivo
                                        if (PUB_FUNCOES.ExisteArquivo(full_name))
                                        {
                                            FileInfo fi = PUB_FUNCOES.InfoArquivo(full_name);
                                            tipo = fi.Extension.ToString();
                                            tamanho = fi.Length.ToString();
                                            status = (int)PUB_ENUM.NF_STATUS.ASSINADA;

                                            // altera o status da nota fiscal
                                            b_tb_nf.AlterarStatus(o_tb_nf.id, status);

                                            // grava chave
                                            b_tb_nf.GravaChave(o_tb_nf.id, chaveNFe);

                                            // grava recibo
                                            b_tb_nf.GravaRecibo(o_tb_nf.id, nroRecibo, dhRecbto);

                                            // grava o path relativo a nota fiscal assinada;
                                            b_tb_nf_xml_venda.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, path_absoluto, path_relativo, arquivo, tamanho, tipo, PUB_SESSAO.Id, status, DateTime.Now);

                                            // grava o historico da nota fiscal
                                            b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultado, DateTime.Now);
                                        }
                                        else
                                        {
                                            Master.MSG_ALERTA(string.Format("Arquivo {0} não foi encontrado.", full_name));
                                        }
                                    }
                                }
                            }

                            o_tb_nf = b_tb_nf.SelecionarObjetoPorId(id_nf);

                            if(Equals(o_tb_nf.id_status,(int)PUB_ENUM.NF_STATUS.ASSINADA))
                            {
                                nfe_Assinada = nf.CarregarXML(o_tb_nf,(int)PUB_ENUM.NF_STATUS.ASSINADA);
                                nfe_Autorizada = nf.BuscaNFe2G(o_tb_nf, ref nfe_Assinada, o_tb_nf.num_recibo, out msgDados, out msgRetWS, out cStat, out msgResultado, out nroProtocolo, out dhProtocolo, out cMsg, out  xMsg);
                                b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultado, DateTime.Now);

                                // NFe Autorizada
                                if (Equals(cStat, 100))
                                {

                                    // path da nota fiscal assinada
                                    path_absoluto = nf.PathAbsoluto(o_tb_nf, PUB_ENUM.NF_STATUS.AUTORIZADA);
                                    path_relativo = nf.PathRelativo(o_tb_nf, PUB_ENUM.NF_STATUS.AUTORIZADA);
                                    arquivo = string.Format("{0}.xml", o_tb_nf.chave);
                                    full_name = string.Format("{0}\\{1}", path_absoluto, arquivo);

                                    // se o diretorio não existir cria um novo diretorio
                                    ExisteArquivo(full_name, path_absoluto);

                                    // Salva o arquivo na pasta autorizada
                                    if (PUB_FUNCOES.SalvarXml(full_name, nfe_Autorizada))
                                    {
                                        // verifica se existe o arquivo
                                        if (PUB_FUNCOES.ExisteArquivo(full_name))
                                        {
                                            FileInfo fi = PUB_FUNCOES.InfoArquivo(full_name);
                                            tipo = fi.Extension.ToString();
                                            tamanho = fi.Length.ToString();
                                            status = (int)PUB_ENUM.NF_STATUS.AUTORIZADA;

                                            // altera o status da nota fiscal
                                            b_tb_nf.AlterarStatus(o_tb_nf.id, status);

                                            // grava protocolo
                                            b_tb_nf.GravaProtocolo(o_tb_nf.id, nroProtocolo, dhProtocolo);

                                            // grava o path relativo a nota fiscal autorizada;
                                            b_tb_nf_xml_venda.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, path_absoluto, path_relativo, arquivo, tamanho, tipo, PUB_SESSAO.Id, status, DateTime.Now);

                                            // grava o historico da nota fiscal
                                            b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, string.Format("O arquivo {0}{1} foi salvo com sucesso", path_absoluto, arquivo), DateTime.Now);

                                            CarregaGrid();

                                            if (nf.GerarPDF(nfe_Autorizada, out msgResultado) < 7902)
                                            {
                                                // grava o historico da nota fiscal
                                                b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultado, DateTime.Now);
                                            }

                                            Master.MSG_ALERTA(msgResultado);

                                        }
                                        else
                                        {
                                            Master.MSG_ALERTA(string.Format("Arquivo {0} não foi encontrado.", full_name));

                                        }
                                    }
                                    else
                                    {
                                        Master.MSG_ALERTA("Arquivo XML não foi encontrado.");
                                    }

                                }

                                // NFe - Lote em processamento
                                if (Equals(cStat, 105))                                                                
                                {
                                    // carrega xml assinada
                                    nfe_Assinada = nf.CarregarXML(o_tb_nf, (int)PUB_ENUM.NF_STATUS.ASSINADA);

                                    // busca a nfe atraves do recibo
                                    nfe_Autorizada = nf.BuscaNFe2G(o_tb_nf, ref nfe_Assinada, o_tb_nf.num_recibo, out msgDados, out msgRetWS, out cStat, out msgResultado, out nroProtocolo, out dhProtocolo, out cMsg, out  xMsg);

                                    // path da nota fiscal assinada
                                    path_absoluto = nf.PathAbsoluto(o_tb_nf, PUB_ENUM.NF_STATUS.PROCESSAMENTO_NA_SEFAZ);
                                    path_relativo = nf.PathRelativo(o_tb_nf, PUB_ENUM.NF_STATUS.PROCESSAMENTO_NA_SEFAZ);
                                    arquivo = string.Format("{0}.xml", o_tb_nf.chave);
                                    full_name = string.Format("{0}\\{1}", path_absoluto, arquivo);

                                    // se o diretorio não existir cria um novo diretorio
                                    ExisteArquivo(full_name, path_absoluto);

                                    // Salva o arquivo na pasta autorizada
                                    if (PUB_FUNCOES.SalvarXml(full_name, nfe_Autorizada))
                                    {
                                        // verifica se existe o arquivo
                                        if (PUB_FUNCOES.ExisteArquivo(full_name))
                                        {
                                            FileInfo fi = PUB_FUNCOES.InfoArquivo(full_name);
                                            tipo = fi.Extension.ToString();
                                            tamanho = fi.Length.ToString();
                                            status = (int)PUB_ENUM.NF_STATUS.PROCESSAMENTO_NA_SEFAZ;

                                            // altera o status da nota fiscal
                                            b_tb_nf.AlterarStatus(o_tb_nf.id, status);

                                            // grava protocolo
                                            b_tb_nf.GravaProtocolo(o_tb_nf.id, nroProtocolo, dhProtocolo);

                                            // grava o path relativo a nota fiscal processamento;
                                            b_tb_nf_xml_venda.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, path_absoluto, path_relativo, arquivo, tamanho, tipo, PUB_SESSAO.Id, status, DateTime.Now);

                                            // grava o historico da nota fiscal
                                            b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultado, DateTime.Now);


                                            Master.MSG_ALERTA(msgResultado + "tente reenviar após alguns minutos.");

                                        }
                                        else
                                        {
                                            Master.MSG_ALERTA(string.Format("Arquivo {0} não foi encontrado.", full_name));

                                        }
                                    }
                                    else
                                    {
                                        Master.MSG_ALERTA("Arquivo XML não foi encontrado.");
                                    }
                                }



                            }


                            if (Equals(o_tb_nf.id_status, (int)PUB_ENUM.NF_STATUS.PROCESSAMENTO_NA_SEFAZ))
                            {

                                // Carrega o XML ASSINADO
                                nfe_Assinada = nf.CarregarXML(o_tb_nf, (int)PUB_ENUM.NF_STATUS.PROCESSAMENTO_NA_SEFAZ);

                                // FAZ A BUSCA DA NOTA FISCAL 
                                nfe_Autorizada = nf.BuscaNFe2G(o_tb_nf, ref nfe_Assinada, o_tb_nf.num_recibo, out msgDados, out msgRetWS, out cStat, out msgResultado, out nroProtocolo, out dhProtocolo, out cMsg, out  xMsg);

                                // NFe Autorizada
                                if (Equals(cStat, 100))
                                {
                                    // path da nota fiscal assinada
                                    path_absoluto = nf.PathAbsoluto(o_tb_nf, PUB_ENUM.NF_STATUS.AUTORIZADA);
                                    path_relativo = nf.PathRelativo(o_tb_nf, PUB_ENUM.NF_STATUS.AUTORIZADA);
                                    arquivo = string.Format("{0}.xml", chaveNFe);
                                    full_name = string.Format("{0}\\{1}", path_absoluto, arquivo);

                                    // se o diretorio não existir cria um novo diretorio
                                    ExisteArquivo(full_name, path_absoluto);

                                    // Salva o arquivo na pasta autorizada
                                    if (PUB_FUNCOES.SalvarXml(full_name, nfe_Autorizada))
                                    {
                                        // verifica se existe o arquivo
                                        if (PUB_FUNCOES.ExisteArquivo(full_name))
                                        {
                                            FileInfo fi = PUB_FUNCOES.InfoArquivo(full_name);
                                            tipo = fi.Extension.ToString();
                                            tamanho = fi.Length.ToString();
                                            status = (int)PUB_ENUM.NF_STATUS.AUTORIZADA;

                                            // altera o status da nota fiscal
                                            b_tb_nf.AlterarStatus(o_tb_nf.id, status);

                                            // grava protocolo
                                            b_tb_nf.GravaProtocolo(o_tb_nf.id, nroProtocolo, dhProtocolo);

                                            // grava o path relativo a nota fiscal autorizada;
                                            b_tb_nf_xml_venda.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, path_absoluto, path_relativo, arquivo, tamanho, tipo, PUB_SESSAO.Id, status, DateTime.Now);

                                            // grava o historico da nota fiscal
                                            b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, string.Format("O arquivo {0}{1} foi salvo com sucesso", path_absoluto, arquivo), DateTime.Now);

                                            CarregaGrid();

                                            if (nf.GerarPDF(nfe_Autorizada, out msgResultado) < 7902)
                                            {
                                                // grava o historico da nota fiscal
                                                b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultado, DateTime.Now);
                                            }

                                            Master.MSG_ALERTA(msgResultado);

                                        }
                                        else
                                        {
                                            Master.MSG_ALERTA(string.Format("Arquivo {0} não foi encontrado.", full_name));

                                        }
                                    }
                                    else
                                    {
                                        Master.MSG_ALERTA("Arquivo XML não foi encontrado.");
                                    }

                                }
                                else
                                {
                                    Master.MSG_ALERTA("A NFe encontra-se em processamento tente novamente após alguns minutos.");
                                }



                            }



                            // NFe Denegada
                            if (Equals(cStat, 301) || Equals(cStat, 302))
                            {

                                // path da nota fiscal assinada
                                path_absoluto = nf.PathAbsoluto(o_tb_nf, PUB_ENUM.NF_STATUS.DENEGADA);
                                path_relativo = nf.PathRelativo(o_tb_nf, PUB_ENUM.NF_STATUS.DENEGADA);
                                arquivo = string.Format("{0}.xml", chaveNFe);
                                full_name = string.Format("{0}\\{1}", path_absoluto, arquivo);

                                ExisteArquivo(full_name, path_absoluto);

                                // Salva o arquivo na pasta autorizada
                                if (PUB_FUNCOES.SalvarXml(full_name, nfe_Autorizada))
                                {
                                    // verifica se existe o arquivo
                                    if (PUB_FUNCOES.ExisteArquivo(full_name))
                                    {
                                        FileInfo fi = PUB_FUNCOES.InfoArquivo(full_name);
                                        tipo = fi.Extension.ToString();
                                        tamanho = fi.Length.ToString();
                                        status = (int)PUB_ENUM.NF_STATUS.DENEGADA;

                                        // altera o status da nota fiscal
                                        b_tb_nf.AlterarStatus(o_tb_nf.id, status);

                                        // grava o path relativo a nota fiscal autorizada;
                                        b_tb_nf_xml_venda.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, path_absoluto, path_relativo, arquivo, tamanho, tipo, PUB_SESSAO.Id, status, DateTime.Now);

                                        // grava o historico da nota fiscal
                                        b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, string.Format("O arquivo {0}{1} foi salvo com sucesso", path_absoluto, arquivo), DateTime.Now);

                                    }
                                    else
                                    {
                                        Master.MSG_ALERTA(string.Format("Arquivo {0} não foi encontrado.", full_name));
                                    }
                                }


                            }


                            // Nfe - Cancelada na base da receita
                            if (Equals(cStat, 218))
                            {
                                // path da nota fiscal assinada
                                path_absoluto = nf.PathAbsoluto(o_tb_nf, PUB_ENUM.NF_STATUS.CANCELADA);
                                path_relativo = nf.PathRelativo(o_tb_nf, PUB_ENUM.NF_STATUS.CANCELADA);
                                arquivo = string.Format("{0}.xml", chaveNFe);
                                full_name = string.Format("{0}\\{1}", path_absoluto, arquivo);

                                ExisteArquivo(full_name, path_absoluto);

                                // Salva o arquivo na pasta autorizada
                                if (PUB_FUNCOES.SalvarXml(full_name, nfe_Autorizada))
                                {
                                    // verifica se existe o arquivo
                                    if (PUB_FUNCOES.ExisteArquivo(full_name))
                                    {
                                        FileInfo fi = PUB_FUNCOES.InfoArquivo(full_name);
                                        tipo = fi.Extension.ToString();
                                        tamanho = fi.Length.ToString();
                                        status = (int)PUB_ENUM.NF_STATUS.CANCELADA;

                                        // altera o status da nota fiscal
                                        b_tb_nf.AlterarStatus(o_tb_nf.id, status);

                                        // grava o path relativo a nota fiscal autorizada;
                                        b_tb_nf_xml_venda.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, path_absoluto, path_relativo, arquivo, tamanho, tipo, PUB_SESSAO.Id, status, DateTime.Now);

                                        // grava o historico da nota fiscal
                                        b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, string.Format("O arquivo {0}{1} foi salvo com sucesso", path_absoluto, arquivo), DateTime.Now);

                                    }
                                    else
                                    {
                                        Master.MSG_ALERTA(string.Format("Arquivo {0} não foi encontrado.", full_name));
                                    }
                                }
                            }    
 
                            break;

                        }
                    }
                    else
                    {
                        msgResultado = "É necessário selecionar uma nota fiscal para transmitir.";
                    }

                    CarregaGrid();         
                    Master.MSG_ALERTA(msgResultado);




                    scope.Complete();

                    scope.Dispose();
                }

            
            }
            catch (Exception)
            {
                
                throw;
            }

                                

        }

        private static void ExisteArquivo(string full_name, string path_absoluto)
        {
            try
            {
                if (!PUB_FUNCOES.ExisteDiretorio(path_absoluto))
                {
                    PUB_FUNCOES.CriarDiretorio(path_absoluto);
                }
                // verifica se existe o arquivo se existir exclui 
                if (PUB_FUNCOES.ExisteArquivo(full_name))
                {
                    PUB_FUNCOES.ExcluirArquivo(full_name);
                }
            }
            catch (Exception)
            {
                
                throw;
            }
           
        }

        protected void IMG_BTN_CANCELAR_NFE_Click(object sender, ImageClickEventArgs e)
        {

            List<string> lista_nf = new List<string>();
            Dictionary<string, string> lista_resultado = new Dictionary<string, string>();
            lista_nf = PUB_FUNCOES.RetornaListaDeValoresDataKeyGridView(GRV_TB_NF, "id");

            NFE nf = new NFE();
            string nfe_XML = string.Empty;
            string msgResultado = string.Empty;
            string msgDados = string.Empty;
            string justificativa = string.Empty;
            string nProtocoloCanc = string.Empty;
            string dProtocoloCanc = string.Empty;
            string retWS = string.Empty;
            string path_absoluto = string.Empty;
            string path_relativo = string.Empty;
            string arquivo = string.Empty;
            string nfe_Cancelada = string.Empty;
            string full_name = string.Empty;
            string tipo = string.Empty;
            int cStat;
            string tamanho = string.Empty;
            int status;

            try
            {                
                foreach (String id in lista_nf)
                {
                    o_tb_nf = b_tb_nf.SelecionarObjetoPorId(Convert.ToInt32(id));

                    if (o_tb_nf.id_status != (int)PUB_ENUM.NF_STATUS.AUTORIZADA)
                    {
                        nfe_Cancelada = nf.CancelaNFe2G(o_tb_nf, out msgDados, out retWS, out cStat, out msgResultado, justificativa, nProtocoloCanc, dProtocoloCanc);

                        if (Equals(cStat, 105))
                        {
                            // path da nota fiscal assinada
                            path_absoluto = nf.PathAbsoluto(o_tb_nf, PUB_ENUM.NF_STATUS.AUTORIZADA);
                            path_relativo = nf.PathRelativo(o_tb_nf, PUB_ENUM.NF_STATUS.AUTORIZADA);
                            arquivo = string.Format("{0}.xml", o_tb_nf.chave);
                            full_name = string.Format("{0}\\{1}", path_absoluto, arquivo);

                            // se o diretorio não existir cria um novo diretorio
                            ExisteArquivo(full_name, path_absoluto);

                            // Salva o arquivo na pasta autorizada
                            if (PUB_FUNCOES.SalvarXml(full_name, nfe_Cancelada))
                            {
                                // verifica se existe o arquivo
                                if (PUB_FUNCOES.ExisteArquivo(full_name))
                                {
                                    FileInfo fi = PUB_FUNCOES.InfoArquivo(full_name);
                                    tipo = fi.Extension.ToString();
                                    tamanho = fi.Length.ToString();
                                    status = (int)PUB_ENUM.NF_STATUS.CANCELADA;

                                    // altera o status da nota fiscal
                                    b_tb_nf.AlterarStatus(o_tb_nf.id, status);

                                    // grava o path relativo a nota fiscal processamento;
                                    b_tb_nf_xml_venda.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, path_absoluto, path_relativo, arquivo, tamanho, tipo, PUB_SESSAO.Id, status, DateTime.Now);

                                    // grava o historico da nota fiscal
                                    b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultado, DateTime.Now);

                                    Master.MSG_ALERTA(msgResultado);
                                }
                                else
                                {
                                    Master.MSG_ALERTA(string.Format("Arquivo {0} não foi encontrado.", full_name));
                                }
                            }
                            else
                            {
                                Master.MSG_ALERTA("Arquivo XML não foi encontrado.");
                            }
                        }
                    }

                }

            }
            catch (Exception ex)
            {
                b_tb_log_erro.IncluirLogErro(ex);
                Master.MSG_ALERTA("Erro ao tentar cancelar a NFe");
                
            }

        }

        protected void IMG_BTN_IMPRIMIR_DANFE_Click(object sender, ImageClickEventArgs e)
        {

            List<string> lista_nf = new List<string>();
            Dictionary<string, string> lista_resultado = new Dictionary<string, string>();
            lista_nf = PUB_FUNCOES.RetornaListaDeValoresDataKeyGridView(GRV_TB_NF, "id");

            NFE nf = new NFE();
            string nfe_XML = string.Empty;
            string msgResultado = string.Empty;
            int cStat = 0;                   

            try
            {             
                foreach (String id in lista_nf)
                {
                    o_tb_nf = b_tb_nf.SelecionarObjetoPorId(Convert.ToInt32(id));

                    if (o_tb_nf.id_status != (int)PUB_ENUM.NF_STATUS.AUTORIZADA)
                    {
                        Master.MSG_ALERTA("É necessário que a nota esteja com status de autorizada para imprimir o DANFE");
                    }
                    else
                    {
                        nfe_XML = nf.CarregarXML(o_tb_nf,(int)PUB_ENUM.NF_STATUS.AUTORIZADA);

                        cStat = nf.GerarPDF(nfe_XML, out msgResultado);

                        if (Equals(cStat, 7900))
                        {
                            b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultado, DateTime.Now);

                        }
                        else
                        {
                            b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultado, DateTime.Now);
                            Master.MSG_ALERTA(msgResultado);
                        }

                    }
                   
                    break;
                }                
            }
            catch (Exception ex)
            {
                b_tb_log_erro.IncluirLogErro(ex);
                Master.MSG_ALERTA("Erro ao tentar imprimir o DANFE");
            }
        }

        protected void IMG_BTN_EXPORTAR_XML_Click(object sender, ImageClickEventArgs e)
        {

            List<string> lista_nf = new List<string>();
            Dictionary<string, string> lista_resultado = new Dictionary<string, string>();
            lista_nf = PUB_FUNCOES.RetornaListaDeValoresDataKeyGridView(GRV_TB_NF, "id");
            BLL_TB_NF_XML_VENDA b_tb_nf_xml_venda = new BLL_TB_NF_XML_VENDA();
            NFE nf = new NFE();
            string msg = string.Empty;
            string nfe_XML = string.Empty;
            string msgResultado = string.Empty;
            string full_name = string.Empty;
            int cStat = 0;
            int id_nf;


            try
            {                
                if (lista_nf.Count > 0)
                {
                    foreach (String id in lista_nf)
                    {
                        id_nf = Convert.ToInt32(id);
                        o_tb_nf = b_tb_nf.SelecionarObjetoPorId(id_nf);

                        if(Equals(o_tb_nf.id_status,(int)PUB_ENUM.NF_STATUS.AUTORIZADA))
                        {                            
                            List<OBJ_TB_NF_XML_VENDA> list_xml_venda = b_tb_nf_xml_venda.SelecionarLista(string.Format("tb_nf_xml_venda.id_empresa = {0} and tb_nf_xml_venda.id_status = {1}", o_tb_nf.id_empresa, o_tb_nf.id_status), "tb_fn_xml_venda.id desc");
                            foreach (OBJ_TB_NF_XML_VENDA o_tb_nf_xml in list_xml_venda)
                            {
                                full_name = o_tb_nf_xml_venda.path_absoluto + "\\" + o_tb_nf_xml_venda.arquivo;
                                FileInfo fi = new FileInfo(full_name);
                                PUB_FUNCOES.ForcaDownload(o_tb_nf_xml_venda.path_relativo, fi);
                                break;
                            }
                            b_tb_nf_historico.Incluir(o_tb_nf.id, o_tb_nf.id_empresa, cStat, msgResultado, DateTime.Now);

                            break;                        
                        }
                        else
                        {
                           msgResultado = "Para exportar o arquivo xml a NFe precisa estar autorizada";
                        }
                    }                

                }
                else
                {
                    msgResultado = "É necessário selecionar uma nota fiscal para transmitir.";

                }

                Master.MSG_ALERTA(msg);

            }
            catch (Exception)
            {
                
                throw;
            }
        }

        protected void GRV_TB_NF_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GRV_TB_NF.PageIndex = e.NewPageIndex;
            PUB_PAGINACAO.PageIndex = e.NewPageIndex;
            CarregaGrid();
        }

        protected void GRV_TB_NF_Sorting(object sender, GridViewSortEventArgs e)
        {

            PUB_PAGINACAO.Sort = e.SortExpression;
            if (PUB_PAGINACAO.SortDirection == SortDirection.Ascending)
            {
                PUB_PAGINACAO.SortDirection = SortDirection.Descending;
                PUB_PAGINACAO.Sort = PUB_PAGINACAO.Sort + " " + PUB_PAGINACAO.DESCENDENTE;
            }
            else
            {
                PUB_PAGINACAO.SortDirection = SortDirection.Ascending;
                PUB_PAGINACAO.Sort = PUB_PAGINACAO.Sort + "  " + PUB_PAGINACAO.ASCENDENTE;
            }

            CarregaGrid();


        }


        protected void IMG_BTN_PESQUISAR_Click(object sender, ImageClickEventArgs e)
        {
            PUB_PAGINACAO.PageIndex = 0;
            CarregaGrid();
        }

        protected void IMG_BTN_PRIMEIRO_Click(object sender, ImageClickEventArgs e)
        {
            PUB_PAGINACAO.PageIndex = 0;
            CarregaGrid();
        }

        protected void IMG_BTN_ANTERIOR_Click(object sender, ImageClickEventArgs e)
        {
            PUB_PAGINACAO.PageIndex = PUB_PAGINACAO.PageIndex - 1;
            CarregaGrid();
        }

        protected void IMG_BTN_PROXIMO_Click(object sender, ImageClickEventArgs e)
        {
            PUB_PAGINACAO.PageIndex = PUB_PAGINACAO.PageIndex + 1;
            CarregaGrid();
        }

        protected void IMG_BTN_ULTIMO_Click(object sender, ImageClickEventArgs e)
        {
            PUB_PAGINACAO.PageIndex = PUB_PAGINACAO.TotalDePaginas - 1;
            CarregaGrid();
        }

        protected void IMG_BTN_FILTRAR_Click(object sender, ImageClickEventArgs e)
        {
            CarregaGrid();
        }

        protected void IMG_BTN_INUTILIZAR_NFE_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                List<string> lista_nf = new List<string>();
                Dictionary<string, string> lista_resultado = new Dictionary<string, string>();
                lista_nf = PUB_FUNCOES.RetornaListaDeValoresDataKeyGridView(GRV_TB_NF, "id");
                BLL_TB_NF_XML_VENDA b_tb_nf_xml_venda = new BLL_TB_NF_XML_VENDA();
                NFE nf = new NFE();
                string msg = string.Empty;
                string nfe_XML = string.Empty;
                string msgResultado = string.Empty;
                string full_name = string.Empty;
                string justificativa = string.Empty;
                string msgDados = string.Empty;
                string msgRetWS = string.Empty;
                string nProtocoloInut = string.Empty;
                string dProtocoloInut = string.Empty;
                string procInutNFe = string.Empty;
                int cStat = 0;
                int id_nf;

                if (lista_nf.Count > 0)
                {
                    foreach (String id in lista_nf)
                    {
                        id_nf = Convert.ToInt32(id);
                        o_tb_nf = b_tb_nf.SelecionarObjetoPorId(id_nf);

                        if (Equals(o_tb_nf.id_status, (int)PUB_ENUM.NF_STATUS.CANCELADA))
                        {
                            msgResultado = "A NFe selecionada está cancelada, por favor selecione outra Nota Fiscal";
                        }
                        else if (Equals(o_tb_nf.id_status, (int)PUB_ENUM.NF_STATUS.DENEGADA))
                        {
                            msgResultado = "A NFe selecionada está denegada, por favor selecione outra Nota Fiscal";
                        }
                        else
                        {
                          procInutNFe =  nf.InutilizaNroNF2G(o_tb_nf, justificativa, out msgDados, out msgRetWS, out cStat, out msgResultado, out nProtocoloInut, out dProtocoloInut);

                          if (Equals(cStat, 102))
                          {

                          }


                        }

                        break;
                    }

                }
                else
                {
                    msgResultado = "É necessário selecionar uma nota fiscal para transmitir.";

                }


                Master.MSG_ALERTA(msg);

            }
            catch (Exception)
            {
                
                throw;
            }
        }
    }
}